const { logger } = require("../config/logConfig");
const jwt = require("jsonwebtoken");
const { redisCreateClient } = require('../config/redis');

async function authMiddleware (req, res, next) {
  const authHeader = req.headers['x-token'] // 解析token,从前端的请求头中
  const token = authHeader && authHeader.split(",")[0];
  const redisClient = await redisCreateClient({ host: '127.0.0.1', port: 6379, db: 0 });
  // 1. 如果请求头中token不存在
  if (!token) {
    return res.status(500).json({ msg: '登录失败!', code: 500 })
  }
  // 从redis 中读取键 token
  const cachedToken = await redisClient.get('token')
  if (!cachedToken) {
    return res.status(500).json({ msg: 'Token 已过期', code: 500 })
  }
  // 验证token
  jwt.verify(token, 'xxx-your-secret-key', async (err, user) => {
    if (err) { // 验证不通过
      logger.error(err);
      return res.status(500).json({ msg: "Token 验证失败, 请重新登录", code: 500 });
    }
    if (cachedToken === token) { // 如果相等则重新设置token的有效期
      await redisClient.set('token', token)
      redisClient.EXPIRE('token', 1800)
    }
    // 将用户信息存储到请求对象中
    req.user = user
    next() // 放行处理下一个中间件
  })
}
module.exports = authMiddleware